﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using Servidor.Dominio;

namespace Servidor.Xml
{
    public static class Datos
    {
        public static XmlDocument abrir(String ruta)
        {
            XmlDocument xDoc = new XmlDocument();
            try
            {
                xDoc.Load(ruta);
            }
            catch (DirectoryNotFoundException ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
            catch (XmlException ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
            return xDoc;
        }

        public static Tarjeta buscarTarjeta(String nroTarjeta)
        {
            List<Tarjeta> lista = new List<Tarjeta>();
            lista = Datos.cargar();
            foreach (Tarjeta tarj in lista)
            {
                if (tarj.Numero.Equals(nroTarjeta))
                    return tarj;
            }
            return null;
        }

        public static void reemplazar(Tarjeta t)
        {
            String numero = t.Numero;
            List<Tarjeta> lista = new List<Tarjeta>();
            lista = Datos.cargar();
            for (int i=0 ; i < lista.Count() ; i++)
            {
                if (lista[i].Numero.Equals(numero))
                {
                    lista.Remove(lista[i]);
                }
            }
            lista.Add(t);
            Datos.salvar(lista);
        }

        public static List<Cuenta> cargarCuentas(XmlElement tarjeta)
        {
            XmlNodeList raizCuentas = tarjeta.GetElementsByTagName("cuentas");
            XmlNodeList cuentasNodos = ((XmlElement)raizCuentas[0]).GetElementsByTagName("Cuenta");
            List<Cuenta> cuentas = new List<Cuenta>();
            
            foreach (XmlElement cuenta in cuentasNodos)
            {
                XmlNodeList numeroCuenta = cuenta.GetElementsByTagName("numero");
                XmlNodeList tipo = cuenta.GetElementsByTagName("tipo");
                XmlNodeList saldo = cuenta.GetElementsByTagName("saldo");
                Cuenta nueva = new Cuenta();
                nueva.Numero = numeroCuenta[0].InnerText;
                nueva.Tipo = tipo[0].InnerText;
                nueva.Saldo = saldo[0].InnerText;
                cuentas.Add(nueva);
            }
            return cuentas;
        }

        public static List<Tarjeta> cargar()
        {
            List<Tarjeta> listaTarjetas = new List<Tarjeta>();

            XmlDocument xDoc = abrir("C:\\ibank3\\iBank-Servidor\\Servidor\\Xml\\archivo.xml");

            //Lista de nodos Tarjeta
            XmlNodeList raiz = xDoc.GetElementsByTagName("tarjetas");
            XmlNodeList tarjetas = ((XmlElement)raiz[0]).GetElementsByTagName("Tarjeta");

            foreach (XmlElement tarjeta in tarjetas)
            {
                //Atributos de Tarjeta
                XmlNodeList numero = tarjeta.GetElementsByTagName("numero");
                XmlNodeList clave = tarjeta.GetElementsByTagName("clave");
                
                //Creacion de Tarjeta
                Tarjeta t = new Tarjeta();
                t.Numero = numero[0].InnerText;
                t.Clave = clave[0].InnerText;
                t.Cuentas = cargarCuentas(tarjeta);

                //Lista de objetos Tarjeta
                listaTarjetas.Add(t);
            }
            return listaTarjetas;
        }

        public static void salvar(List<Tarjeta> lista)
        {
            XmlTextWriter writer = new XmlTextWriter("C:\\iBank3\\iBank-Servidor\\Servidor\\Xml\\archivo.xml", null);
            writer.Formatting = Formatting.Indented;

            writer.WriteStartElement("tarjetas");
            if (lista != null)
            {
                foreach (Tarjeta t in lista)
                {
                    writer.WriteStartElement("Tarjeta");
                    writer.WriteElementString("numero", t.Numero);
                    writer.WriteElementString("clave", t.Clave);
                    writer.WriteStartElement("cuentas");
                    if (t.Cuentas != null)
                    {
                        foreach (Cuenta c in t.Cuentas)
                        {
                            writer.WriteStartElement("Cuenta");
                            writer.WriteElementString("numero", c.Numero);
                            writer.WriteElementString("tipo", c.Tipo);
                            writer.WriteElementString("saldo", c.Saldo);
                            writer.WriteEndElement(); // fin de Cuenta
                        }
                    }
                    writer.WriteEndElement(); // fin de cuentas
                    writer.WriteEndElement(); // fin de Tarjeta
                }
            }
            writer.WriteEndElement(); // fin de tarjetas
            writer.Close();
        }
    }
}